#ifndef __AI_TEST_H__
#define __AI_TEST_H__
#include <stdint.h>
#include <limits.h>
#include "thread_ctrl.h"

#define AI_ITEM_NAME            "AI"
#define AI_ITEM_NUM             (1 + 4)
#define AI_ARGV_OFFSET          2
#define AI_DRV_NAME             "pcie_ai"
#define AI_MAX_NUM              32

enum ai_mode {
    AI_MOD_SMP          = 0,                /* 连续采集，滑窗滤波，不发中断 */
    AI_MOD_SMP_TIM      = 1,                /* 连续采集，定时（抽样滑窗数据）触发PCIe中断 */
    AI_MOD_RAW_DMA      = 2,                /* 连续采集，原始数据，发DMA中断 */
    AI_MOD_RAW          = 3,                /* 连续采集，原始数据，不发中断 */
};

enum ai_osr {
    AI_OSR_0            = 0,                /* 过采样值 0 */
    AI_OSR_2            = 2,                /* 过采样值 2 */
    AI_OSR_4            = 4,                /* 过采样值 4 */
    AI_OSR_8            = 8,                /* 过采样值 8 */
    AI_OSR_16           = 16,               /* 过采样值 16 */
    AI_OSR_32           = 32,               /* 过采样值 32 */
    AI_OSR_64           = 64,               /* 过采样值 64 */
    AI_OSR_128          = 128,              /* 过采样值 128 */
};

enum ai_range {
    AI_RANGE_10V0       = 0x00,             /* ±10V */
    AI_RANGE_2V5        = 0x01,             /* ±2.5V */
    AI_RANGE_5V         = 0X02,             /* ±5V */
    AI_RANGE_10V        = 0x03,             /* ±10V */
};

enum ai_cmd {
    AI_CMD_START        = 0x1111,           /* 开始 AI 采集指令 */
    AI_CMD_STOP         = 0x2222,           /* 停止 AI 采集指令 */
    AI_CMD_CONFIG       = 0x3333,           /* 配置 AI 参数指令 */
};

/* AI 设备 */
struct ai_dev_t {
    void *parent;                           /* 父指针 */
    char name[32];                          /* 设备名 */
    uint8_t index;                          /* 索引号 */
    uint8_t range;                          /* 通道量程 */
    int value;                              /* 通道数值 */

    char path[PATH_MAX];                    /* 路径 */
    int fd;                                 /* 文件 */
    struct thread_param_t *read_thread;     /* 接收线程 */
};

/* AI 信息 */
struct ai_param_t {
    void *parent;                           /* 父指针 */
    char name[32];                          /* 设备名 */
    uint8_t dev_id;                         /* 设备索引号 */
    uint8_t dev_num;                        /* 设备数量 */
    uint8_t max_num;                        /* 最大数量 */
    uint8_t type;                           /* 模块类型 */

    struct ai_dev_t *dev;                   /* AI 设备 */
    int32_t val[AI_MAX_NUM];                /* AI 通道数据 */
    uint8_t mode;                           /* 模式 */
    uint8_t osr;                            /* 过采样 */
    uint32_t sample;                        /* 采样率 */
    uint16_t samp_tim;                      /* 抽样定时间隔 */
    uint16_t slid_win;                      /* 滑动平均窗口 */
    uint8_t val_type;                       /* 数据类型 */

    uint8_t item_id;                        /* 测试项目号 */
    uint8_t en_read;                        /* 使能接收 */
    int read_cnt;                           /* 接收数量 */
};

struct ai_item_t {
    struct thread_info_t *thread;
    struct ai_param_t *param;
};

extern struct ai_param_t ai_param;

int ai_test(int argc, char *argv[]);

#endif /* __AI_TEST_H__ */
